<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>instanceof和hasOwn</title>
    <script>
        /* 
            instanceof
                用来检查一个对象是不是类的实例，并不检查一个对象是否直接由这个类所创建。

                检查的是该对象的原型链上是否有该实例，只要原型链上存在,就会true.

            in  
                使用in运算符检查属性时，无论属性在对象自身还是在原型中，都会返回true

            hasownProperty（不推荐）
                (对象).hasOwnProperty(属性名)
                检查对象自身中是否有该属性,也就是对象本身里面有就是true,存到原型里也是false.
            
            hasOwn(静态方法)
                Objcet.hasOwn(对象，属性名)

        */


        class  Animals{
            name ='狗'
            sayHello(){

            }
        }
        class  Dog extends Animals{
            
        }

        const dog = new Dog()

        // instanceof 用来检查该对象是不是该类的实例

        // dog-->Animals的实例-->Object的实例-->Object原型

        // Object是所有对象的原型，任何对象和Object进行instance of运算都会返回true
        console.log(dog instanceof Dog)     //true
        console.log(dog instanceof Animals) //true
        console.log(window instanceof Object)
        console.log(Object.prototype)


        class Person{
            constructor(name,age){
                this.name=name
                this.age=age
            }
            sayHello(){
                console.log('我是',this.name)
            }
        }

        const p1= new Person('小李',27)
        console.log('name' in p1)
        Object.prototype()
        // 使用in运算符检查属性时，无论属性在对象自身还是在原型中，都会返回true
        console.log('sayHello' in p1)

        console.log(p1.hasOwnProperty('sayhello'))
        console.log(dog.hasOwnProperty('name'))
        console.log(Object.hasOwn(dog,'name'))

    </script>
</head>
<body>
    
</body>
</html>